Hi 大家好,我是 Fong,會接觸 GraphQL 是因為目前的公司使用它來做後端的 API,因此想來紀錄一下這段學習的歷程及總結,這一系列文章除了講解技術以外也會介紹 GraphQL 的設計精神,我也會同時提供一些經驗談談談一些使用上的想法及踩雷心得 XD
簡介一下,
GraphQL 是一種為 API 設計的資料查詢(修改)的語言,
使得 client 端可以使用更直覺且彈性的語法來取得或修改資料。
這項技術是由 Facebook 從 2012 年開始使用,
為了因應跨裝置及開發 News Feed 功能而開發,
後來覺得用得太爽了,
所以就於 2015 公開釋出 ,讓大家一起爽 (原文)
大概念上有點類似 SQL,
使用者透過輸入定義好的語法,
取得所需的資料 (如 SELECT
) 或是修改指定的資料 (如 CREATE
、 UPDATE
)。
不過 GraphQL 主要使用於應用服務之間的溝通(尤其是前後端)。
可以想像是一種新型態的 RESTful API,
但是有更多更強大的功能!
至於為什麼他這幾年聲勢看漲,
許多知名企業如 Github 、 Shopify 、 Coursera 、 Twitter 都開始使用呢?
我大概歸因為三個因素:
而 GraphQL 剛好解決以上的問題,可參考以下的架構圖:
接下來就用幾個範例提供大家一個輪廓。
簡單來說, GraphQL API 提供一個 Schema (Server 維護),而 Client Side 只要輸入合法的 Query,就可以獲得所需的資料。
需注意,很多人會把 Schema 跟 Query 使用的 syntax 搞混,但這兩個完全不同!
再來點進階的範例:假設現在有一個社交服務,需要取得目前的使用者資料:
可以發現 Server Response 回傳的資料都是以 JSON 格式呈現,
因此結構跟資料表達性上都十分不錯!
既然是社交服務,
沒有朋友當邊緣人多可憐,
而且還得附加貼文功能才能吸引更多好友!
首先我們新增 Object Type Post
定義貼文資料結構,
再來在 User
Type 添加兩個 fields: friends
及 posts
分別取得朋友及個人貼文的資料:
眼尖的朋友或許發現了個範例展現了 GraphQL 著名的特點: Like a graph!
有了 GraphQL ,你可以把你的商業模型 (business model) 像圖形 (graph) 一樣串連起來
不同或相同type 的資料可以串接再一起,
使得 GraphQL 只要一筆 query 就能一次拿全資料且資料格式非常有彈性!
反觀 RESTful API 同樣的資料需要多筆 request 才能拿到且格式難以調整。
以上完整的範例可以到我的 GraphQL Playground Example 玩玩,打開其中的 HISTORY 標籤可以看到 query 歷程紀錄。如下圖:
如果想要看這段程式碼怎麼實現的可以參考:My Apollo Glitch example
PS 以上幾個範例為展示用,沒辦法完全看懂很正常,但如果有興趣想完全搞懂的,請務必追蹤我未來的文章 XD
以下就來介紹幾點 GraphQL 的優點及缺點。
精準資料取得
相較之下 RESTful API 就需要多趟來回 (multiple round-trips) 才能拿足資料且缺乏彈性
程式即文檔
這點真的讚,透過互動式的 IDE 解析 Schema 而產生的 Spec 不但一清二楚而且 UI 也很好看 XD。如圖
前端控制權提升
高度自由的實作方式
強型別 (Strongly Typed)
過於自由、規範少
學習成本
仍是一種新技術(?)相關社群仍在開發中
目前最有名的開源社群非 Apollo 莫屬,有興趣可參考看看
Server Side Caching 實作困難
如果 GraphQL 還是不夠吸引你,那我再舉個例子,使用一個 API 系統就像在百貨公司的地下美食廣場買晚餐,傳統的 RESTful API 會要求你要一家一家 (很多 route) 去點餐,耗時又費力。
為了留住客人的心,百貨公司的餐飲店家們開發出一款點餐 APP 整合各家的點餐介面,消費者只要把想點的各家食物放進菜單 (還可以選擇雞排要切不要辣),一鍵送出後就只要等待所有餐點送來桌上,省時又不費力!
使用 GraphQL 的體驗就如同使用 APP 一樣,此外通過 APP 還可以更容易取得額外資訊如餐廳的聯絡方式、營業額甚至是創業故事 XD。
其實相關優秀的 GraphQL 學習資源相當多,我將在下面一一列舉,不過中文方面比較沒有一個統合的學習整理,而之前也有前輩有做過 GraphQL 相關的鐵人賽主題,講得也非常好,不過比較偏實作路線,但我覺得 GraphQL 很多精彩的地方不在於「工具」,而是其衍生出的「理念」。
我目前任職的公司正在使用 GraphQL,但是因為之前對於 GraphQL 的認識不夠深,因此很可惜地沒有發揮GraphQL 的優勢(我們都戲稱 Restful GraphQL XD)。
因此我鐵人賽前半段介紹完這項技術的基礎後,就會開始專注在一些較為深入的主題或 Design Pattern 等等,
並且盡量顧及理論及實作。
另外如果想玩玩一些大公司的公開 GraphQL API,
可到 GraphQLHub。
Reference:
學習資源:
很期待你接下來的這個系列, GraphQL 這個新技術實在缺少一些討論的資源
哈哈沒想到會把你釣出來 XD
大大您好,非常喜歡您寫的Graphql,獲益良多,只是在看的過程發現有些小地方會讓code跑不起來,請問可以在留言板直接跟大大說哪裡是需要修改的嗎?
哈囉你好~ 因為我每篇文章篇幅都有點多 XD
在時間壓力下,很容易顧及不到每篇程式碼每個細節的正確性 (但觀念基本上沒有錯)。
如果有問題,就直接在底下留言即可~我會直接用留言回覆給你~
另外在完賽後,我會花時間把整個系列的文章重新編排 + debug 一遍。
您好 ~
感謝有您的文章,真的講得非常透徹
我想問一下上面架構圖的 Query,是不是應該是 me { id } 呢
對!我寫錯了...我會修正的~謝謝!